/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package verificaforcadasenha;


/**
 *
 * @author Marcos André
 */
public class Regra01 {
    
    private static int PONTO_POR_UMA_OCORRENCIA_DE_MAIUSCULA = 5;
    private static int PONTO_POR_UMA_OCORRENCIA_DE_MINUSCULA = 1;
    private static int PONTO_POR_UMA_OCORRENCIA_DE_DIGITO = 5;
    private static int PONTO_POR_OCORRENCIA_DE_3_OU_MAIS_DIGITOS =5;
    private static int PONTO_POR_OCORRENCIA_DE_UM_SIMBOLO =5;
    private static int PONTO_POR_OCORRENCIA_DE_DOIS_SIMBOLOS =5;
    private static int PONTO_POR_CONTER_MAIUSCULA_E_MINUSCULA = 2;
    private static int PONTO_POR_CONTER_LETRA_E_DIGITO = 2;
    private static int PONTO_POR_CONTER_LETRA_OU_DIGITO_COM_SIMBOLO = 2;
    private String password;

    public Regra01(String password) {
        this.password = password;
    }

    private int CombinedOcurrences(Utils PasswordGenericcheck, int score) {
        
        int NumberUpperCaseLetters = PasswordGenericcheck.getQuantidadeDeLetrasMaiusculas();
        int NumberLowerCaseLetters = PasswordGenericcheck.getQuantidadeDeLetrasMinusculas();
        int NumberDigits = PasswordGenericcheck.getQuantidadeDeNumeros();
        int NumberSimbols = PasswordGenericcheck.getQuantidadeDeSimbolos();
        if ((NumberUpperCaseLetters >=1) && (NumberLowerCaseLetters >= 1))
        {
           score += PONTO_POR_CONTER_MAIUSCULA_E_MINUSCULA;
        }
        if ((NumberUpperCaseLetters >=1) || (NumberLowerCaseLetters >= 1) && (NumberDigits >=1 ))
        {
           score += PONTO_POR_CONTER_LETRA_E_DIGITO;
        }
        if ((NumberUpperCaseLetters >=1) || (NumberLowerCaseLetters >= 1) || (NumberDigits >=1 ) && (NumberSimbols >=1))
       {
          score += PONTO_POR_CONTER_LETRA_OU_DIGITO_COM_SIMBOLO;
       }return score;
    }
     
    public int PasswordLength (){
        
        int BorderArrays [] = {6,8,16,Integer.MAX_VALUE};
        String Scores [] = { "3","6","12","18"};
        
        String result = Utils.obterResultadoDaPontuacaoNoIntervalo(password.length(), BorderArrays, Scores);
        int score = Integer.parseInt(result);
        
        return score;

    }
    
    public int PasswordAnalysis () throws appSenhaException
    {
        int score = 0;
        Utils PasswordGenericcheck = new Utils (password);
        int TempResultUtils = PasswordGenericcheck.getQuantidadeDeLetrasMaiusculas();
        score += PONTO_POR_UMA_OCORRENCIA_DE_MAIUSCULA * TempResultUtils; //incrementa a score de acorod com as ocorrencias de letras maiusculas
        TempResultUtils = PasswordGenericcheck.getQuantidadeDeLetrasMinusculas();
        score += PONTO_POR_UMA_OCORRENCIA_DE_MINUSCULA * TempResultUtils; //incrementa a score de acordo com as ocorrencias letras minusculas
        TempResultUtils = PasswordGenericcheck.getQuantidadeDeNumeros();
        score += PONTO_POR_UMA_OCORRENCIA_DE_DIGITO  * TempResultUtils; //incrementa a score de acordo com as ocorrencias de numeros
        
        if (TempResultUtils >=3)
        {
            score += PONTO_POR_OCORRENCIA_DE_3_OU_MAIS_DIGITOS ;          // Regra: Se a senha conter 3 digitos ou mais a score é acrescida em 5 pontos.
        }
        
        TempResultUtils = PasswordGenericcheck.getQuantidadeDeSimbolos();
        if (TempResultUtils == 1)
        {
            score += PONTO_POR_OCORRENCIA_DE_UM_SIMBOLO ; //Soma 5 pontos a score corrente se houver ocorrencia de 1 simbolo na senha
        }
        if (TempResultUtils >=2)
        {
            score +=  PONTO_POR_OCORRENCIA_DE_DOIS_SIMBOLOS; //Soma 5 pontos na score corrente se houver mais do que 2 simbolos da senha
        }
        score = CombinedOcurrences(PasswordGenericcheck, score); //atribui pontos de acordo com regras de ocorrencia combinada de digitos, numeros e simbolos.
      
      return score;
    }
}